//! 流程POST数据模型。

use serde::{Deserialize, Serialize};

/// 代办列表请求参数，格式为json。
///
/// 所有参数均可选。
///
/// conditions: 高级搜索条件 可以把多个条件放入这个map中，下面为具体说明
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ToDoListRequest {
    #[serde(flatten)]
    pub conditions: Option<Conditiion>,
    pub is_merge_show: Option<bool>,
    pub is_need_os: Option<bool>,
    pub page_no: Option<String>,
    pub page_size: Option<String>,
    pub user_id: Option<String>,
}

/// conditions: 高级搜索条件 可以把多个条件放入这个map中，下面为具体说明
///
/// - requestname : 请求名称    如 出差流程
/// - requestlevel : 紧急程度   0  正常  1 重要  2 紧急
/// - ownerdepartmentid : 创建人部门id
/// - creatersubcompanyid : 创建人分部id
/// - createdateselect:   创建时间
///   - 0 全部
///   - 1   今天
///   - 2   本周
///   - 3    本月
///   - 4   本季
///   - 5  本年
///   - 6   指定时间区间   需要添加 另外两个参数
///     - createdatefrom   开始时间 如 2019-12-08
///     - createdateto        结束时间 如 2019-12-09
///   - 7  上一月
///   - 8 上一年
/// - operatedateselect : 操作时间
///   - 0 全部
///   - 1 今天
///   - 2 本周
///   - 3 本月
///   - 4 本季
///   - 5 本年
///   - 6 指定时间区间， 需要添加另外两个参数
///     - operatedatefrom   开始时间 如 2019-12-08
///     - operatedateto         结束时间 如 2019-12-09
///   - 7 上一月
///   - 8 上一年
/// - recievedateselect: 接受时间
///   - 0 全部
///   - 1 今天
///   - 2 本周
///   - 3 本月
///   - 4 本季
///   - 5 本年
///   - 6 指定时间区间，需要添加另外两个参数
///     - recievedatefrom     开始时间 如 2019-12-08
///     - recievedateto          结束时间 如 2019-12-09
///   - 7 上一月
///   - 8 上一年
/// - archivestatus ： 流程是否归档。 1 已归档  2 未归档
/// - nodetype : 当前节点类型。 0：创建，1：批准，2：提交，3：归档
/// - docids : 相关文档。 可传入 流程相关文档id
/// - hrmcreaterid : 相关人力资源。   可 传入流程相关人员id
/// - crmids : 相关客户。    可 传入相关客户id
/// - proids : 相关项目 。     可传入相关项目id
/// - workcode : 创建人编号。 可传入创建人的编号，对应hrmresource表中的workcode
/// - wfcode : 流程编号。  
/// - creatertype , craterid , createrid2
///   - cratertype : 0 创建人为员工  1 创建人为客户
///   - createrid : 员工id
///   - createrid2 : 客户id
/// - unophrmid : 未操作人id , 只支持 传入一个人员id
/// -workflowIds：流程路径id，以','分隔
/// -workflowTypes：流程类型id,以','分隔
///
/// // TODO: 待补充可选字段。
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Conditiion {
    pub wfcode: Option<String>,
    pub ownerdepartmentid: Option<String>,
    pub requestname: Option<String>,
    pub nodetype: Option<String>,
    pub workcode: Option<String>,
    pub archivestatus: Option<String>,
    pub operatedateselect: Option<String>,
    pub recievedateselect: Option<String>,
    pub creatersubcompanyid: Option<String>,
    pub requestlevel: Option<String>,
    pub unophrmid: Option<String>,
    pub docids: Option<String>,
    pub creatertype: Option<String>,
    pub proids: Option<String>,
    pub crmids: Option<String>,
    pub craterid: Option<String>,
    pub hrmcreaterid: Option<String>,
    pub createdateselect: Option<String>,
    pub createdatefrom: Option<String>,
    pub operatedateto: Option<String>,
}

#[cfg(test)]
mod tests {
    use super::*;
    use serde_json;

    #[test]
    fn test_deserialize_1() {
        let json_str = r#"{
            "wfcode": "11111",
            "ownerdepartmentid": "101",
            "requestname": "请假流程",
            "nodetype": "2",
            "workcode": "120",
            "archivestatus ": "1",
            "operatedateselect": "1",
            "recievedateselect": "1",
            "creatersubcompanyid": "10",
            "requestlevel": "0",
            "unophrmid": "1111",
            "docids": "1234,1124",
            "creatertype": "0",
            "proids": "123",
            "crmids": "222",
            "craterid": "111",
            "hrmcreaterid": "111",
            "createdateselect": "1"
          }"#;

        let des = serde_json::from_str::<ToDoListRequest>(json_str);
        // println!("{:#?}", des);

        assert!(des.is_ok());
    }

    #[test]
    fn test_serialize_1() {
        let req = ToDoListRequest {
            conditions: None,
            is_merge_show: None,
            is_need_os: None,
            page_no: None,
            page_size: None,
            user_id: None,
        };

        let j = serde_json::to_string(&req);

        println!("{:#?}", j);
    }
}
